package org.cs456;
import java.io.IOException;

import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class Preview extends SurfaceView implements SurfaceHolder.Callback {
   private static final String TAG = "Preview";

   SurfaceHolder mHolder;
   public Camera camera;

   Preview(Context context) {
      super(context);

      // Install a SurfaceHolder.Callback so we get notified when the
      // underlying surface is created and destroyed.
      mHolder = getHolder();
      mHolder.addCallback(this);
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   }

   private PreviewCallback previewCallback = new PreviewCallback() {
       public void onPreviewFrame(byte[] data, Camera arg1) {
          Preview.this.invalidate();
       }
    };
    
   public void surfaceCreated(SurfaceHolder holder) {
      // The Surface has been created, acquire the camera and tell it where
      // to draw.
      camera = Camera.open();
      try {
         camera.setPreviewDisplay(holder);
         camera.setPreviewCallback(previewCallback);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public void surfaceDestroyed(SurfaceHolder holder) {
      // Surface will be destroyed when we return, so stop the preview.
      // Because the CameraDevice object is not a shared resource, it's very
      // important to release it when the activity is paused.
		if(camera!=null){
			camera.stopPreview();
			camera.setPreviewCallback(null);
			camera.release();	
			camera=null;
		}

   }

   public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
      // Now that the size is known, set up the camera parameters and begin
      // the preview.
	   
      Camera.Parameters parameters = camera.getParameters();
      parameters.setPreviewSize(w, h);
      camera.setDisplayOrientation(getOrientationAngle());
      camera.setParameters(parameters);
      camera.startPreview();
   }
   
   private int getOrientationAngle(){
	   if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
		   return 0;
	   else
		   return 90;
   }

   @Override
   public void draw(Canvas canvas) {
      super.draw(canvas);
      Paint p = new Paint(Color.RED);
      Log.d(TAG, "draw");
      canvas.drawText("PREVIEW", canvas.getWidth() / 2,
            canvas.getHeight() / 2, p);
   }
}